<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: Win32 下的 OLE 接口</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/if_ole.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>if_ole</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="if_ole.txt">if_ole.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2023年2月


                  <code class="vim">VIM 参考手册    by Paul Moore</code>
                                <code class="vim">译者</code>: Dasn


Vim 的 OLE 接口                                         <b class="vimtag"> <a name="ole-interface">ole-interface</a> </b>

1. 激活 OLE 功能                 <a href="if_ole.html#ole-activation">ole-activation</a> 
2. 方法                          <a href="if_ole.html#ole-methods">ole-methods</a> 
3. "normal" 命令                 <a href="if_ole.html#ole-normal">ole-normal</a> 
4. 注册                          <a href="if_ole.html#ole-registration">ole-registration</a> 
5. 与微软的 Visual Studio 集成   <a href="if_ole.html#MSVisualStudio">MSVisualStudio</a> 

<code class="notvi">{仅当编译时加入  <a href="various.html#+ole">+ole</a>  特性才有效。参见 src/if_ole.INSTALL}</code>
一个替代方案是使用 客户机服务器 模式进行通信  <a href="remote.html#clientserver">clientserver</a> 。

</section><hr class="doubleline" /><section class=inner>
<h4>1. 激活 OLE 功能                                        <b class="vimtag"> <a name="ole-activation">ole-activation</a> </b></h4>
Vim 可以作为 OLE 服务器运行，能被任意的 OLE 客户端访问，例如: 我们可以用
Visual Basic，Python，或者 Perl 与 Vim 通信。Vim 的程序名 (在 OLE 中称为
"ProgID") 是 "Vim.Application"。

因此，要启动一个 Vim 实例 (或者要与一个已经启动的实例通信)，你应该使用类似于下
面的代码:

[Visual Basic] 
<code class="example">        Dim Vim As Object</code>
<code class="example">        Set Vim = CreateObject("Vim.Application")</code>
<code class="example"></code>
[Python] 
<code class="example">        from win32com.client.dynamic import Dispatch</code>
<code class="example">        vim = Dispatch('Vim.Application')</code>
<code class="example"></code>
[Perl] 
<code class="example">        use Win32::OLE;</code>
<code class="example">        $vim = new Win32::OLE 'Vim.Application';</code>
<code class="example"></code>
[C#] 
<code class="example">        // 在项目中加入 Vim 的引用。</code>
<code class="example">        // 选择 COM 标签页。</code>
<code class="example">        // 选择 "Vim Ole Interface 1.1 Type Library"</code>
<code class="example">        Vim.Vim vimobj = new Vim.Vim();</code>
<code class="example"></code>
Vim 不能作为 "隐藏" 的 OLE 服务器来运行，这一点 Vim 不像其它一些 OLE 服务器。
Vim 的 OLE 客户端启动时，一个 Vim 程序的实例会立刻显现出来。简单地断开 OLE 连
接不能关掉 Vim 实例，需要显式地执行退出命令才可以 (例如，:qa!，:wqa)。

</section><hr class="doubleline" /><section class=inner>
<h4>2. 方法                                                 <b class="vimtag"> <a name="ole-methods">ole-methods</a> </b></h4>
Vim 为客户端提供了四种方法。

                                                        <b class="vimtag"> <a name="ole-sendkeys">ole-sendkeys</a> </b>
SendKeys(keys)          执行一系列键击。

这个函数只需要一个参数，参数 keys 代表要敲击的字符串。通过此函数发送这些字符串
和你直接在 Vim 里敲击键盘的效果是一样的。特殊键可以用它们的 &lt;..&gt; 名字，就像映
射的右手边里的格式一样 (参考  <a href="map.html#:map">:map</a>  特殊键的表达方式<code class="vim">译者</code>)。<code class="note">备注</code>: 不支持 Ex 模
式下的 "normal" 命令 - 见下面  <a href="if_ole.html#ole-normal">ole-normal</a> 。

例子: (Visual Basic 语法) 
<code class="example">        Vim.SendKeys "ihello&lt;Esc&gt;"</code>
<code class="example">        Vim.SendKeys "ma1GV4jy`a"</code>
<code class="example"></code>
这个例子假设 Vim 处于普通模式，要强制进入普通模式，可以在字符序列前加入
<code class="keystroke">CTRL-\</code> <code class="keystroke">CTRL-N</code>，就像这样: 
<code class="example"></code>
<code class="example">        Vim.SendKeys "&lt;C-\&gt;&lt;C-N&gt;ihello&lt;Esc&gt;"</code>
<code class="example"></code>
(<code class="vim">译者注</code>: 下面是 Perl 语法:   
<code class="example"></code>
<code class="example">        $vim-&gt;SendKeys("&lt;C-\\&gt;&lt;C-N&gt;ihello&lt;Esc&gt;");</code>

        <code class="note">备注</code>: 在 Perl 语法里，特殊字符前需要加 "\"。)

<code class="keystroke">CTRL-\</code> <code class="keystroke">CTRL-N</code> 使得 Vim 从插入模式或命令行模式返回普通模式。
<code class="note">备注</code>: 不能用这个命令发送 Vim 命令的一部分。
                                                        <b class="vimtag"> <a name="ole-eval">ole-eval</a> </b>
Eval(expr)              计算表达式的值。

函数只有一个参数 expr，Vim 正常格式的表达式 (参考  <a href="eval.html#expression">expression</a> )。返回值是一个
包含表达式结果的字符串。 <a href="eval.html#List">List</a>  通过连接项目并插入换行符以转化为字符串。

例子: (Visual Basic 语法) 
<code class="example"></code>
<code class="example">        Line20 = Vim.Eval("getline(20)")</code>
<code class="example">        Twelve = Vim.Eval("6 + 6")              ' 注意，这是一个字符串。</code>
<code class="example">        Font = Vim.Eval("&amp;guifont")</code>

                                                        <b class="vimtag"> <a name="ole-setforeground">ole-setforeground</a> </b>
SetForeground()         让 Vim 窗口转入前台工作。

这个函数没有参数，没有返回值。

例子: (Visual Basic 语法) 
<code class="example"></code>
<code class="example">        Vim.SetForeground</code>

                                                        <b class="vimtag"> <a name="ole-gethwnd">ole-gethwnd</a> </b>
GetHwnd()       返回 Vim 窗口的句柄。

这个函数没有参数，它返回 Vim 主窗口的句柄。你可以用它来控制 Vim 窗口，或者跟踪
窗口的 z-深度 等位置。

例子: (Visual Basic 语法) 
<code class="example"></code>
<code class="example">        Vim_Hwnd = Vim.GetHwnd</code>


</section><hr class="doubleline" /><section class=inner>
<h4>3. "normal" 命令                                        <b class="vimtag"> <a name="ole-normal">ole-normal</a> </b></h4>
因为 Vim 是通过 Ex 模式下的 :normal 命令来实现对 OLE 命令的处理，所以 Vim 不能
通过 OLE 执行 :normal 命令。如果你这样做，肯定没用。至于产生的结果，也许没什么
害处，也许不能预料。

现在没有办法能捕获这种错误，所以用户在使用的时候要<code class="note">注意</code>有这么一个限制。
</section><hr class="doubleline" /><section class=inner>
<h4>4. 注册                                         <b class="vimtag"> <a name="ole-registration">ole-registration</a> </b> <b class="vimtag"> <a name="E243">E243</a> </b></h4>
在 Vim 作为 OLE 服务器运行之前，必须向系统注册。如果你想注册，可以在运行 Vim
的时候加一个参数 "-register"。
                                                        <b class="vimtag"> <a name="-register">-register</a> </b>  
<code class="example">        gvim -register</code>
<code class="example"></code>
如果运行 OLE 版本的 gvim 时，Vim 的 OLE 服务没有注册，gvim 会弹出一个对话框，
让你选择是否注册，选择 "Yes" 注册。

有时候可能注册不会成功，这可能是因为注册表不可写。如果是这个原因，你需要以管理
员的身份来运行 gvim。

一旦注册，Vim 的路径就会被存储到注册表里。在你移动、删除或升级 Vim 之前，应该
使用 "-unregister" 清除这些注册信息。
                                                        <b class="vimtag"> <a name="-unregister">-unregister</a> </b>  
<code class="example">        gvim -unregister</code>
<code class="example"></code>
系统会使用最先注册的 Vim 执行 OLE 命令。如果 Vim 已经运行，那么就使用当前运行
的 Vim。如果你不想让 (多个) Vim 响应 OLE 命令，请使用非 OLE 版本的 Vim，并且把
它放到别的目录里。这时，OLE 版本的 Vim 路径不应包含在你的正常路径里，这样当你
键入 "gvim" 时启动的才是非 OLE 版本。

                                                        <b class="vimtag"> <a name="-silent">-silent</a> </b>
如果不想让 Vim 在注册时弹出对话框，可以在前面加 "-silent" 参数:

<code class="example">        gvim -silent -register</code>
<code class="example">        gvim -silent -unregister</code>
<code class="example"></code>
</section><hr class="doubleline" /><section class=inner>
<h4>5. 与微软的 Visual Studio 集成                          <b class="vimtag"> <a name="MSVisualStudio">MSVisualStudio</a> </b></h4>
9.0.0698 补丁从 Vim 中删除了旧有的 "VisVim" 集成。


<code class="section">在 Visual Studio .Net 里使用 Vim </code>

.Net Studio 已经提供了外部编辑器的支持。按以下步骤进行:

在 .Net Studio 里，选择菜单 Tools-&gt;External Tools...
加入
     Title     - Vim
     Command   - c:\vim\vim63\gvim.exe
     Arguments - --servername VS_NET --remote-silent "+call cursor($(CurLine), $(CurCol))" $(ItemPath)
     Init Dir  - 空

现在在 .Net 里打开文件时，可以在 .Net 菜单里选择: Tools-&gt;Vim

这样就能在 Vim 里打开文件。
可以把该外部命令作为图标加入，把它放在任何你喜欢的位置上。也可以把它设为你的缺
省编辑器。

如果你有进一步的改进，请到 Vim 邮件列表上发帖，以告知我们。

--servername VS_NET
建立 vim 的新实例，名为 VS_NET。这样如果你从 VS 里打开多个文件，它们会使用相同
的 Vim 实例。这样，你可以运行多个 Vim 的备份，但可以控制在哪个里编辑 VS 文件。

--remote-silent "+call cursor(10, 27)"
              - 把光标放在第 10 行第 27 列
Vim 里 
<code class="example">   :h --remote-silent 可以了解详情</code>
<code class="example"></code>
[.Net 的评注由 Dave Fishburn 和 Brian Sturk 提供]

</section><hr class="doubleline" /><section class=inner>
<h4> vim:tw=78:ts=8:noet:ft=help:norl:</h4>
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
